<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="format-detection" content="telephone=no"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><link rel="icon" href="/images/icons/favicon-16x16.png?v=2.8.0" type="image/png" sizes="16x16"><link rel="icon" href="/images/icons/favicon-32x32.png?v=2.8.0" type="image/png" sizes="32x32"><meta name="description" content="Building a Movable Robot Model with URDF 用URDF建立移动机器人模型         原文链接: https:&#x2F;&#x2F;wiki.ros.org&#x2F;urdf&#x2F;Tutorials&#x2F;Building a Movable Robot Model with URDF  Description: Learn how to define movable">
<meta property="og:type" content="article">
<meta property="og:title" content="【urdf_tutorials】Building a Movable Robot Model with URDF 用URDF建立移动机器人模型">
<meta property="og:url" content="http://hipposox.github.io/2023/01/10/urdf-tutorials-02/index.html">
<meta property="og:site_name" content="Hexo">
<meta property="og:description" content="Building a Movable Robot Model with URDF 用URDF建立移动机器人模型         原文链接: https:&#x2F;&#x2F;wiki.ros.org&#x2F;urdf&#x2F;Tutorials&#x2F;Building a Movable Robot Model with URDF  Description: Learn how to define movable">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://www.helloimg.com/images/2023/01/12/oGcomX.png">
<meta property="article:published_time" content="2023-01-10T09:00:34.000Z">
<meta property="article:modified_time" content="2023-01-12T15:29:21.501Z">
<meta property="article:author" content="HippoSoX">
<meta property="article:tag" content="ros">
<meta property="article:tag" content="URDF">
<meta property="article:tag" content="Joints">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://www.helloimg.com/images/2023/01/12/oGcomX.png"><title>【urdf_tutorials】Building a Movable Robot Model with URDF 用URDF建立移动机器人模型 | Hexo</title><link ref="canonical" href="http://hipposox.github.io/2023/01/10/urdf-tutorials-02/"><link rel="dns-prefetch" href="https://cdn.jsdelivr.net"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.12.1/css/all.min.css" type="text/css"><link rel="stylesheet" href="/css/index.css?v=2.8.0"><link rel="stylesheet" href="css/custom.css"><script>var Stun = window.Stun || {};
var CONFIG = {
  root: '/',
  algolia: undefined,
  assistSearch: undefined,
  fontIcon: {"prompt":{"success":"fas fa-check-circle","info":"fas fa-arrow-circle-right","warning":"fas fa-exclamation-circle","error":"fas fa-times-circle"},"copyBtn":"fas fa-copy"},
  sidebar: {"offsetTop":"20px","tocMaxDepth":6},
  header: {"enable":true,"showOnPost":true,"scrollDownIcon":false},
  postWidget: {"endText":true},
  nightMode: {"enable":true},
  back2top: {"enable":true},
  codeblock: {"style":"default","highlight":"dark","wordWrap":false},
  reward: false,
  fancybox: false,
  zoomImage: {"gapAside":"20px"},
  galleryWaterfall: undefined,
  lazyload: true,
  pjax: undefined,
  externalLink: {"icon":{"enable":true,"name":"fas fa-external-link-alt"}},
  shortcuts: undefined,
  prompt: {"copyButton":"复制","copySuccess":"复制成功","copyError":"复制失败"},
  sourcePath: {"js":"js","css":"css","images":"images"},
};

window.CONFIG = CONFIG;</script><meta name="generator" content="Hexo 5.4.2"></head><body><div class="container" id="container"><header class="header" id="header"><div class="header-inner"><nav class="header-nav header-nav--fixed"><div class="header-nav-inner"><div class="header-nav-menubtn"><i class="fas fa-bars"></i></div><div class="header-nav-menu"><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="/"><span class="header-nav-menu-item__icon"><i class="fas fa-home"></i></span><span class="header-nav-menu-item__text">首页</span></a></div><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="/archives/"><span class="header-nav-menu-item__icon"><i class="fas fa-folder-open"></i></span><span class="header-nav-menu-item__text">归档</span></a></div><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="/categories/"><span class="header-nav-menu-item__icon"><i class="fas fa-layer-group"></i></span><span class="header-nav-menu-item__text">分类</span></a></div><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="/tags/"><span class="header-nav-menu-item__icon"><i class="fas fa-tags"></i></span><span class="header-nav-menu-item__text">标签</span></a></div></div><div class="header-nav-mode"><div class="mode"><div class="mode-track"><span class="mode-track-moon"></span><span class="mode-track-sun"></span></div><div class="mode-thumb"></div></div></div></div></nav><div class="header-banner"><div class="header-banner-info"><div class="header-banner-info__title">erocool</div><div class="header-banner-info__subtitle">You know what</div></div></div></div></header><main class="main" id="main"><div class="main-inner"><div class="content-wrap" id="content-wrap"><div class="content" id="content"><!-- Just used to judge whether it is an article page--><div id="is-post"></div><div class="post"><header class="post-header"><h1 class="post-title">【urdf_tutorials】Building a Movable Robot Model with URDF 用URDF建立移动机器人模型</h1><div class="post-meta"><span class="post-meta-item post-meta-item--createtime"><span class="post-meta-item__icon"><i class="far fa-calendar-plus"></i></span><span class="post-meta-item__info">发表于</span><span class="post-meta-item__value">2023-01-10</span></span><span class="post-meta-item post-meta-item--updatetime"><span class="post-meta-item__icon"><i class="far fa-calendar-check"></i></span><span class="post-meta-item__info">更新于</span><span class="post-meta-item__value">2023-01-12</span></span></div></header><div class="post-body">
        <h1 id="building-a-movable-robot-model-with-urdf-用urdf建立移动机器人模型"   >
          <a href="#building-a-movable-robot-model-with-urdf-用urdf建立移动机器人模型" class="heading-link"><i class="fas fa-link"></i></a><a class="markdownIt-Anchor" href="#building-a-movable-robot-model-with-urdf-用urdf建立移动机器人模型"></a> Building a Movable Robot Model with URDF 用URDF建立移动机器人模型</h1>
      
<blockquote>
<p>原文链接: <span class="exturl"><a class="exturl__link"   target="_blank" rel="noopener" href="https://wiki.ros.org/urdf/Tutorials/Building%20a%20Movable%20Robot%20Model%20with%20URDF" >https://wiki.ros.org/urdf/Tutorials/Building a Movable Robot Model with URDF</a><span class="exturl__icon"><i class="fas fa-external-link-alt"></i></span></span></p>
</blockquote>
<p>Description: Learn how to define movable joints in URDF</p>
<p>描述：了解如何在URDF中定义活动关节</p>
<p>Keywords: URDF, Joints</p>
<p>关键词：URDF，关节</p>
<p>Tutorial Level: BEGINNER</p>
<p>教程级别：初学者</p>
<p>Next Tutorial: Adding Physical and Collision Properties to the Model</p>
<p>下一篇教程：向模型添加物理和碰撞特性</p>
<p>In this tutorial, we’re going to revise the R2D2 model we made in the previous tutorial so that it has movable joints. In the previous model, all of the joints were fixed. Now we’ll explore three other important types of joints: continuous, revolute and prismatic.</p>
<p>在本教程中，我们将修改上一教程中创建的R2D2模型，使其具有可移动关节。在以前的模型中，所有关节都是固定的。现在我们将探讨其他三种重要类型的关节：连续关节、旋转关节和棱柱关节。</p>
<p>Make sure you have installed all prerequisites before continuing. See the previous tutorial for information on what is required.</p>
<p>继续之前，请确保已安装所有必备组件。有关所需内容的信息，请参见上一教程。</p>
<p>Again, all of the robot models mentioned in this tutorial can be found in the urdf_tutorial package.</p>
<p>同样，本教程中提到的所有机器人模型都可以在urdf_tutorial包中找到。</p>
<p>Here is the new urdf with flexible joints. You can compare it to the previous version to see everything that has changed, but we’re just going to focus on three example joints.</p>
<p>这是带有柔性接头的新urdf。您可以将其与以前的版本进行比较，以查看所有更改，但我们将只关注三个示例关节。</p>
<p>To visualize and control this model, run the same command as the last tutorial: <code>roslaunch urdf_tutorial display.launch model:=urdf/06-flexible.urdf</code> However now this will also pop up a GUI that allows you to control the values of all the non-fixed joints. Play with the model some and see how it moves. Then, we can take a look at how we accomplished this.</p>
<p>要可视化和控制此模型，请运行与上一教程相同的命令：<code>roslaunch urdf_tutorial display.launch model:=urdf/06-flexible.urdf</code>但是现在这也将弹出一个GUI，允许您控制所有非固定关节的值。玩一下模型，看看它如何移动。然后，我们可以看看我们是如何做到这一点的。</p>
<p><a target="_blank" rel="noopener" href="https://www.helloimg.com/image/oGcomX">
        <img   class="lazyload lazyload-gif"
          src="/images/loading.svg" data-src="https://www.helloimg.com/images/2023/01/12/oGcomX.png"  alt="flexible" border="0" />
      </a></p>
<span id="more"></span>

        <h2 id="1-the-head"   >
          <a href="#1-the-head" class="heading-link"><i class="fas fa-link"></i></a><a class="markdownIt-Anchor" href="#1-the-head"></a> 1 The Head</h2>
      
<figure class="highlight xml"><div class="table-container"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">joint</span> <span class="attr">name</span>=<span class="string">&quot;head_swivel&quot;</span> <span class="attr">type</span>=<span class="string">&quot;continuous&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">parent</span> <span class="attr">link</span>=<span class="string">&quot;base_link&quot;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">child</span> <span class="attr">link</span>=<span class="string">&quot;head&quot;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">axis</span> <span class="attr">xyz</span>=<span class="string">&quot;0 0 1&quot;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">origin</span> <span class="attr">xyz</span>=<span class="string">&quot;0 0 0.3&quot;</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">joint</span>&gt;</span></span><br></pre></td></tr></table></div></figure>
<p>The connection between the body and the head is a continuous joint, meaning that it can take on any angle from negative infinity to positive infinity. The wheels are also modeled like this, so that they can roll in both directions forever.</p>
<p>The only additional information we have to add is the axis of rotation, here specified by an xyz triplet, which specifies a vector around which the head will rotate. Since we want it to go around the z axis, we specify the vector “0 0 1”.</p>
<p>身体和头部之间的连接是一个连续的关节，这意味着它可以呈现从负无穷大到正无穷大的任何角度。车轮也是这样建模的，因此它们可以永远在两个方向上滚动。<br />
我们必须添加的唯一附加信息是旋转轴，这里由xyz三元组指定，它指定头部将围绕其旋转的向量。因为我们希望它绕z轴旋转，所以我们指定向量“0 0 1”。</p>

        <h2 id="2-the-gripper"   >
          <a href="#2-the-gripper" class="heading-link"><i class="fas fa-link"></i></a><a class="markdownIt-Anchor" href="#2-the-gripper"></a> 2 The Gripper</h2>
      
<figure class="highlight xml"><div class="table-container"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">joint</span> <span class="attr">name</span>=<span class="string">&quot;left_gripper_joint&quot;</span> <span class="attr">type</span>=<span class="string">&quot;revolute&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">axis</span> <span class="attr">xyz</span>=<span class="string">&quot;0 0 1&quot;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">limit</span> <span class="attr">effort</span>=<span class="string">&quot;1000.0&quot;</span> <span class="attr">lower</span>=<span class="string">&quot;0.0&quot;</span> <span class="attr">upper</span>=<span class="string">&quot;0.548&quot;</span> <span class="attr">velocity</span>=<span class="string">&quot;0.5&quot;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">origin</span> <span class="attr">rpy</span>=<span class="string">&quot;0 0 0&quot;</span> <span class="attr">xyz</span>=<span class="string">&quot;0.2 0.01 0&quot;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">parent</span> <span class="attr">link</span>=<span class="string">&quot;gripper_pole&quot;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">child</span> <span class="attr">link</span>=<span class="string">&quot;left_gripper&quot;</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">joint</span>&gt;</span></span><br></pre></td></tr></table></div></figure>
<p>Both the right and the left gripper joints are modeled as revolute joints. This means that they rotate in the same way that the continuous joints do, but they have strict limits. Hence, we must include the limit tag specifying the upper and lower limits of the joint (in radians). We also must specify a maximum velocity and effort for this joint but the actual values don’t matter for our purposes here.</p>
<p>左右夹持器关节都建模为旋转关节。这意味着它们以与连续关节相同的方式旋转，但它们有严格的限制。因此，我们必须包含指定关节上限和下限（以弧度为单位）的限制标记。我们还必须指定该关节的最大速度和作用力，但实际值对我们的目的来说并不重要。</p>

        <h2 id="3-the-gripper-arm"   >
          <a href="#3-the-gripper-arm" class="heading-link"><i class="fas fa-link"></i></a><a class="markdownIt-Anchor" href="#3-the-gripper-arm"></a> 3 The Gripper Arm</h2>
      
<figure class="highlight xml"><div class="table-container"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">joint</span> <span class="attr">name</span>=<span class="string">&quot;gripper_extension&quot;</span> <span class="attr">type</span>=<span class="string">&quot;prismatic&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">parent</span> <span class="attr">link</span>=<span class="string">&quot;base_link&quot;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">child</span> <span class="attr">link</span>=<span class="string">&quot;gripper_pole&quot;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">limit</span> <span class="attr">effort</span>=<span class="string">&quot;1000.0&quot;</span> <span class="attr">lower</span>=<span class="string">&quot;-0.38&quot;</span> <span class="attr">upper</span>=<span class="string">&quot;0&quot;</span> <span class="attr">velocity</span>=<span class="string">&quot;0.5&quot;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">origin</span> <span class="attr">rpy</span>=<span class="string">&quot;0 0 0&quot;</span> <span class="attr">xyz</span>=<span class="string">&quot;0.19 0 0.2&quot;</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">joint</span>&gt;</span></span><br></pre></td></tr></table></div></figure>
<p>The gripper arm is a different kind of joint, namely a prismatic joint. This means that it moves along an axis, not around it. This translational movement is what allows our robot model to extend and retract its gripper arm.</p>
<p>夹持器臂是一种不同类型的关节，即棱柱关节。这意味着它沿着轴移动，而不是围绕轴移动。这种平移运动使我们的机器人模型能够伸展和缩回其夹持臂。</p>
<p>The limits of the prismatic arm are specified in the same way as a revolute joint, except that the units are meters, not radians.</p>
<p>棱柱臂的限制以与旋转关节相同的方式指定，但单位是米，而不是弧度。</p>

        <h2 id="4-other-types-of-joints"   >
          <a href="#4-other-types-of-joints" class="heading-link"><i class="fas fa-link"></i></a><a class="markdownIt-Anchor" href="#4-other-types-of-joints"></a> 4 Other Types of Joints</h2>
      
<p>There are two other kinds of joints that move around in space. Whereas the prismatic joint can only move along one dimension, a planar joint can move around in a plane, or two dimensions. Furthermore, a floating joint is unconstrained, and can move around in any of the three dimensions. These joints cannot be specified by just one number, and therefore aren’t included in this tutorial.</p>
<p>还有两种其他类型的关节可以在空间中移动。虽然棱柱关节只能沿一维移动，但平面关节可以在平面或二维中移动。此外，浮动关节是不受约束的，可以在任意三维空间中移动。这些关节不能仅由一个数字指定，因此不包含在本教程中。</p>

        <h2 id="5-specifying-the-pose"   >
          <a href="#5-specifying-the-pose" class="heading-link"><i class="fas fa-link"></i></a><a class="markdownIt-Anchor" href="#5-specifying-the-pose"></a> 5 Specifying the Pose</h2>
      
<p>As you move the sliders around in the GUI, the model moves in Rviz. How is this done? First the GUI parses the URDF and finds all the non-fixed joints and their limits. Then, it uses the values of the sliders to publish sensor_msgs/JointState messages. Those are then used by robot_state_publisher to calculate all of transforms between the different parts. The resulting transform tree is then used to display all of the shapes in Rviz.</p>
<p>当您在GUI中移动滑块时，模型在Rviz中移动。这是怎么做到的？首先，GUI解析URDF并查找所有非固定关节及其限制。然后，它使用滑块的值发布sensor_msgs/JointState消息。然后，robot_state_publisher使用它们来计算不同部分之间的所有变换。然后，生成的变换树用于显示Rviz中的所有形状。</p>

        <h2 id="6-next-steps"   >
          <a href="#6-next-steps" class="heading-link"><i class="fas fa-link"></i></a><a class="markdownIt-Anchor" href="#6-next-steps"></a> 6 Next steps</h2>
      
<p>Now that you have a visibly functional model, you can add in some physical properties, or start using xacro to simplify your code.</p>
<p>现在您已经有了一个明显的功能模型，您可以添加一些物理属性，或者开始使用xacro来简化代码。</p>
</div><footer class="post-footer"><div class="post-ending ending"><div class="ending__text">------ 本文结束，感谢您的阅读 ------</div></div><div class="post-copyright copyright"><div class="copyright-author"><span class="copyright-author__name">本文作者: </span><span class="copyright-author__value"><a href="http://hipposox.github.io">HippoSoX</a></span></div><div class="copyright-link"><span class="copyright-link__name">本文链接: </span><span class="copyright-link__value"><a href="http://hipposox.github.io/2023/01/10/urdf-tutorials-02/">http://hipposox.github.io/2023/01/10/urdf-tutorials-02/</a></span></div><div class="copyright-notice"><span class="copyright-notice__name">版权声明: </span><span class="copyright-notice__value">本博客所有文章除特别声明外，均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en" rel="external nofollow" target="_blank">BY-NC-SA</a> 许可协议。转载请注明出处！</span></div></div><div class="post-tags"><span class="post-tags-item"><span class="post-tags-item__icon"><i class="fas fa-tag"></i></span><a class="post-tags-item__link" href="http://hipposox.github.io/tags/ros/">ros</a></span><span class="post-tags-item"><span class="post-tags-item__icon"><i class="fas fa-tag"></i></span><a class="post-tags-item__link" href="http://hipposox.github.io/tags/URDF/">URDF</a></span><span class="post-tags-item"><span class="post-tags-item__icon"><i class="fas fa-tag"></i></span><a class="post-tags-item__link" href="http://hipposox.github.io/tags/Joints/">Joints</a></span></div><nav class="post-paginator paginator"><div class="paginator-prev"><a class="paginator-prev__link" href="/2023/01/10/urdf-tutorials-03/"><span class="paginator-prev__icon"><i class="fas fa-angle-left"></i></span><span class="paginator-prev__text">【urdf_tutorials】Using Xacro to Clean Up a URDF File 使用Xacro清理URDF文件</span></a></div><div class="paginator-next"><a class="paginator-next__link" href="/2023/01/10/urdf-tutorials-01/"><span class="paginator-prev__text">【urdf_tutorials】Building a Visual Robot Model with URDF from Scratch 用URDF从头开始构建视觉机器人模型</span><span class="paginator-next__icon"><i class="fas fa-angle-right"></i></span></a></div></nav></footer></div></div></div><div class="sidebar-wrap" id="sidebar-wrap"><aside class="sidebar" id="sidebar"><div class="sidebar-nav"><span class="sidebar-nav-toc current">文章目录</span><span class="sidebar-nav-ov">站点概览</span></div><section class="sidebar-toc"><ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#building-a-movable-robot-model-with-urdf-%E7%94%A8urdf%E5%BB%BA%E7%AB%8B%E7%A7%BB%E5%8A%A8%E6%9C%BA%E5%99%A8%E4%BA%BA%E6%A8%A1%E5%9E%8B"><span class="toc-number">1.</span> <span class="toc-text">
           Building a Movable Robot Model with URDF 用URDF建立移动机器人模型</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#1-the-head"><span class="toc-number">1.1.</span> <span class="toc-text">
           1 The Head</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#2-the-gripper"><span class="toc-number">1.2.</span> <span class="toc-text">
           2 The Gripper</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#3-the-gripper-arm"><span class="toc-number">1.3.</span> <span class="toc-text">
           3 The Gripper Arm</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#4-other-types-of-joints"><span class="toc-number">1.4.</span> <span class="toc-text">
           4 Other Types of Joints</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#5-specifying-the-pose"><span class="toc-number">1.5.</span> <span class="toc-text">
           5 Specifying the Pose</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#6-next-steps"><span class="toc-number">1.6.</span> <span class="toc-text">
           6 Next steps</span></a></li></ol></li></ol></section><!-- ov = overview--><section class="sidebar-ov hide"><div class="sidebar-ov-author"><div class="sidebar-ov-author__avatar"><img class="sidebar-ov-author__avatar_img" src="/images/icons/stun-logo.svg" alt="avatar"></div><p class="sidebar-ov-author__text">motto</p></div><div class="sidebar-ov-state"><a class="sidebar-ov-state-item sidebar-ov-state-item--posts" href="/archives/"><div class="sidebar-ov-state-item__count">19</div><div class="sidebar-ov-state-item__name">归档</div></a><a class="sidebar-ov-state-item sidebar-ov-state-item--categories" href="/categories/"><div class="sidebar-ov-state-item__count">6</div><div class="sidebar-ov-state-item__name">分类</div></a><a class="sidebar-ov-state-item sidebar-ov-state-item--tags" href="/tags/"><div class="sidebar-ov-state-item__count">14</div><div class="sidebar-ov-state-item__name">标签</div></a></div><div class="sidebar-ov-cc"><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en" target="_blank" rel="noopener" data-popover="知识共享许可协议" data-popover-pos="up"><img src="/images/cc-by-nc-sa.svg"></a></div></section><div class="sidebar-reading"><div class="sidebar-reading-info"><span class="sidebar-reading-info__text">你已阅读了 </span><span class="sidebar-reading-info__num">0</span><span class="sidebar-reading-info__perc">%</span></div><div class="sidebar-reading-line"></div></div><iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=86 src="//music.163.com/outchain/player?type=2&id=1449790718&auto=1&height=66"></iframe></aside></div><div class="clearfix"></div></div></main><footer class="footer" id="footer"><div class="footer-inner"><div><span>Copyright © 2023</span><span class="footer__icon"><i class="fas fa-heart"></i></span><span>HippoSoX</span></div><div><span>由 <a href="http://hexo.io/" title="Hexo" target="_blank" rel="noopener">Hexo</a> 强力驱动</span><span> v5.4.2</span><span class="footer__devider">|</span><span>主题 - <a href="https://github.com/liuyib/hexo-theme-stun/" title="Stun" target="_blank" rel="noopener">Stun</a></span><span> v2.8.0</span></div></div></footer><div class="loading-bar" id="loading-bar"><div class="loading-bar__progress"></div></div><div class="back2top" id="back2top"><span class="back2top__icon"><i class="fas fa-rocket"></i></span></div></div><script src="https://cdn.jsdelivr.net/npm/jquery@v3.4.1/dist/jquery.min.js"></script><script src="https://cdn.jsdelivr.net/npm/velocity-animate@1.5.2/velocity.min.js"></script><script src="https://cdn.jsdelivr.net/npm/velocity-animate@1.5.2/velocity.ui.min.js"></script><script src="https://cdn.jsdelivr.net/npm/lazyload@2.0.0-rc.2/lazyload.min.js"></script><script src="/js/utils.js?v=2.8.0"></script><script src="/js/stun-boot.js?v=2.8.0"></script><script src="/js/scroll.js?v=2.8.0"></script><script src="/js/header.js?v=2.8.0"></script><script src="/js/sidebar.js?v=2.8.0"></script></body></html>